home *** CD-ROM | disk | FTP | other *** search
/ Aminet 5 / Aminet 5 - March 1995.iso / Aminet / misc / amag / AM9402_2.lha / tips & tricks / closewindow.asm < prev    next >
Assembly Source File  |  1993-12-27  |  7KB  |  261 lines

  1. *******************************************************************
  2. *     Demonstration zur Funktion "WindowClose"      *
  3. *-----------------------------------------------------------------*
  4. *                  *
  5. * Dieses Programm schließt alle Fenster auf der Workbench.      *
  6. * Aufruf von der CLI/Shell: [CloseWindow] ohne Parameter      *
  7. *                   *
  8. *   Beschreibung:              *
  9. *                  *
  10. * Ausgehend vom Ersten geöffneten Fenster auf der Workbench,       *
  11. * schickt es jedem eine Nachricht vom Typ IDCMP_CLOSEWINDOW, was  *
  12. * bewirkt, daß, sofern ein Close-Gadget vorhanden ist, das Fenster*
  13. * geschlossen wird und alle zusätzlichen Resourcen vom System und *
  14. * dem zuständigen Task freigegeben werden!          *
  15. *                  *
  16. *   Benutzter Assembler:               *
  17. * MaxonASM in der Version 1.1              *
  18. *  Tabulator: 16              *
  19. *                  *
  20. * Die Demo läßt sich aber auch mit allen anderen Assemblern       *
  21. * übersetzen!                  *
  22. * Vorraussetzung ist allerdings das Vorhandensein von OS 2.0 und  *
  23. * den dazugehörigen Includes!              *
  24. *                  *
  25. *******************************************************************
  26.  
  27.     INCLUDE    intuition/intuition.i
  28.     INCLUDE    intuition/intuitionbase.i
  29.     INCLUDE    intuition/intuition_lib.i
  30.     INCLUDE    exec/devices.i
  31.     INCLUDE    exec/exec_lib.i
  32.     INCLUDE    devices/input.i
  33.     INCLUDE    devices/inputevent.i
  34.  
  35. *----Benötigte Resourcen öffnen---
  36.  
  37. Main    move.l    $4.w,a6
  38.     lea    IntName(pc),a1
  39.     moveq    #37,d0    OS 2.0!
  40.     jsr    _LVOOpenLibrary(a6)
  41.  
  42.     lea    _IntBase(pc),a0
  43.     move.l    d0,(a0)
  44.     beq    .NoInt
  45.     move.l    d0,a6
  46.  
  47.     lea    InpName(pc),a0
  48.     moveq    #0,d0
  49.     moveq    #IOSTD_SIZE,d1
  50.     bsr    _OpenDevice    ;Input.device öffnen
  51.  
  52.     lea    _IOReq(pc),a0
  53.     move.l    d0,(a0)
  54.     beq.s    .NoDev
  55.  
  56. *----Workbench-Screen finden---
  57.  
  58.     suba.l    a0,a0    WBenchScreen
  59.     jsr    _LVOLockPubScreen(a6)
  60.     move.l    d0,d6
  61.     beq.s    .NoPubScreen
  62.     move.l    d0,a3
  63.     move.l    sc_FirstWindow(a3),d5
  64.     beq.s    .freeall
  65.  
  66.     move.l    d5,a0
  67.  
  68. .loop    move.l    wd_NextWindow(a0),d5
  69.     bsr    WindowClose
  70.     move.l    d5,a0
  71.     move.l    wd_NextWindow(a0),d5
  72.     beq.s    .closelast    ;kein weiteres Fenster
  73.     bra.s    .loop
  74.  
  75. .closelast
  76.     bsr    WindowClose    ;letztes Fenster schließen
  77.  
  78. *----Alles freigeben-------------------------------------------------
  79.  
  80. .freeall    suba.l    a0,a0
  81.     move.l    d6,a1
  82.     jsr    _LVOUnlockPubScreen(a6)
  83.  
  84. .NoPubScreen    move.l    _IOReq,a0
  85.     bsr    _CloseDevice
  86.  
  87. .NoDev    move.l    _IntBase,a1
  88.     move.l    $4.w,a6
  89.     jsr    _LVOCloseLibrary(a6)
  90.  
  91. .NoInt    moveq    #0,d0
  92.     rts
  93.  
  94.  
  95. *******************************************************************
  96. *                     WindowClose          *
  97. *                  *
  98. * Funktion: sendet IDCMP_CLOSEWINDOW an ang. Window      *
  99. * Eingabe : a0=Ptr auf Window               *
  100. * Ausgabe : d0=TRUE/FALSE              *
  101. *                  *
  102. * Bemerkung: IntBase und _IOReq müssen korrekt initialisiert sein!*
  103. *******************************************************************
  104.  
  105. WindowClose    movem.l    d1-a6,-(sp)
  106.  
  107.     move.l    a0,a4    Testen, ob
  108.     move.l    wd_IDCMPFlags(a4),d0   auf das Flag
  109.     and.l    #IDCMP_CLOSEWINDOW,d0  gewartet
  110.     cmp.l    #IDCMP_CLOSEWINDOW,d0  wird
  111.     bne.s    .noclosegg           NEIN -> ab!
  112.  
  113.     move.l    a4,a0       Gewünschtes
  114.     move.l    _IntBase,a6       Fenster aktivieren
  115.     jsr    _LVOActivateWindow(a6)
  116.  
  117.     move.l    _IOReq,a0       IOReq nach a0
  118.     lea    inputEvent(pc),a1  inputEvent nach a1
  119.     move.b    #IECLASS_CLOSEWINDOW,ie_Class(a1) Msg setzen
  120.     bsr    _IDWriteEvent      und Msg senden
  121.  
  122. .weiter    moveq    #1,d0    TRUE
  123.     bra.s    .weg
  124.  
  125. .noclosegg    ;*--Kein CloseGadget vorhanden, Benutzer aufmerksam machen-
  126.  
  127.     moveq    #0,d0    FALSE
  128.  
  129. .weg    movem.l    (sp)+,d1-a6
  130.     rts
  131.  
  132. *********************************************************************
  133. *    _OpenDevice                *
  134. *                    *
  135. * Funktion: Device öffnen                *
  136. * Eingabe : a0=ptr auf Namen (z.B. "audio.device",0)        *
  137. *           d0=Unit                *
  138. *           d1=Länge d. IORequest - Blockes            *
  139. * Ausgabe : d0=ptr auf IOreq oder NULL bei Fehler        *
  140. *                    *
  141. * Bemerkung : nutzt Funktionen des V36++ OS            *
  142. *********************************************************************
  143.  
  144. _OpenDevice    movem.l    d1-a6,-(sp)
  145.  
  146.     move.l    a0,a4    Namen retten
  147.     move.l    d0,d7    Unit retten
  148.     move.l    d1,d6    Länge retten
  149.  
  150.     move.l    4.w,a6
  151.     jsr    _LVOCreateMsgPort(a6)
  152.     move.l    d0,a3
  153.     beq.s    .noPort
  154.  
  155.     move.l    d6,d0
  156.     jsr    _LVOCreateIORequest(a6)
  157.     move.l    d0,a2
  158.     beq.s    .noIoreq
  159.  
  160.     move.l    a4,a0    Namen nach a0
  161.     move.l    d7,d0    Unit nach d0
  162.     move.l    a2,a1    IORequest nach a1
  163.     moveq    #0,d1    keine Flags
  164.     jsr    _LVOOpenDevice(a6)
  165.     tst    d0    Rückgabe testen
  166.     beq.s    .ok    d0=0, alles Ok
  167.  
  168. .noDevice    move.l    a2,a0    IOreq nach a0
  169.     jsr    _LVODeleteIORequest(a6)
  170.  
  171. .noIoreq    move.l    a3,a0    Port nach a0
  172.     jsr    _LVODeleteMsgPort(a6)
  173.  
  174. .noPort    moveq    #0,d0    Rückwert FALSE setzen
  175.     bra.s    .weg
  176.  
  177. .ok    move.l    a2,d0    IORequest nach d0
  178.  
  179. .weg    movem.l    (sp)+,d1-a6
  180.     rts
  181.  
  182.  
  183. *********************************************************************
  184. *    _CloseDevice                *
  185. *                     *
  186. * Funktion: schließt Device und gibt alle Resourcen frei        *
  187. * Eingabe : a0=ptr auf IOreq                *
  188. * Ausgabe : ----------------                *
  189. *                    *
  190. * Bemerkung: benutzt Funktionen des V36++ OS            *
  191. *********************************************************************
  192.  
  193. _CloseDevice    movem.l    d0-a6,-(sp)
  194.  
  195.     move.l    a0,d0    testen, ob IOreq
  196.     beq.s    .weg    existiert!
  197.     move.l    a0,a5    IOreq nach a5
  198.     move.l    $4.w,a6    ExecBase nach a6
  199.  
  200. .closedev    move.l    IO_DEVICE(a0),d0 Testen, ob Device
  201.     beq.s    .closemp     zu öffnen war!
  202.     move.l    a0,a1     ja!
  203.     jsr    _LVOCloseDevice(a6) Schließen
  204.  
  205. .closemp    move.l    MN_REPLYPORT(a5),d0 Testen, ob Port
  206.     beq.s    .closeIOreq        zu öffnen war!
  207.     move.l    d0,a0        ja!
  208.     jsr    _LVODeleteMsgPort(a6) Schließen
  209.  
  210. .closeIOreq    move.l    a5,a0        IOreq schließen
  211.     jsr    _LVODeleteIORequest(a6)
  212.  
  213. .weg    movem.l    (sp)+,d0-a6        Register vom Stack
  214.     rts            und weg
  215.  
  216.  
  217. *********************************************************************
  218. *                          _IDWriteEvent                            *
  219. *                    *
  220. * Funktion: InputEvent an das aktuelle Window schicken        *
  221. * Eingabe : a0=ptr auf IOreq                    *
  222. *           a1=ptr auf inputEvent            *
  223. * Ausgabe : d0=ERROR                *
  224. *                     *
  225. *********************************************************************
  226.  
  227. _IDWriteEvent    movem.l    d1/a0-a2/a6,-(sp)
  228.  
  229.     move.l    a1,IO_DATA(a0)            inputEvent eintragen
  230.     move.l    #ie_SIZEOF,IO_LENGTH(a0) größe eintragen
  231.  
  232.     move.l    a0,a1    IOReq nach a1 für DoIo
  233.     move.l    a0,a2    IOReq retten
  234.  
  235.     move    #IND_WRITEEVENT,IO_COMMAND(a1)
  236.     move.l    $4.w,a6
  237.     jsr    _LVODoIO(a6)    Prozedur ausführen
  238.  
  239.     moveq    #0,d0    d0 löschen
  240.     move.b    IO_ERROR(a2),d0    Error Byte holen
  241.  
  242.     movem.l    (sp)+,d1/a0-a2/a6
  243.     rts
  244.  
  245. *----Texte und Strukturen--------------------------------------------
  246.  
  247. Version:    dc.b    "$VER WindowClose V0.01 (10.11.93)",0
  248.     even
  249.  
  250. IntName    dc.b    "intuition.library",0
  251.     even
  252. InpName    dc.b    "input.device",0
  253.     even
  254. WBenchName    dc.b    "Workbench",0
  255.     even
  256.  
  257. _IntBase    dc.l    0
  258. _IOReq    dc.l    0
  259.  
  260. inputEvent    ds.b    ie_SIZEOF
  261.     END